package com.xrit.sunnyday.service.impl;

import com.alibaba.druid.util.StringUtils;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.StringUtil;
import com.xrit.sunnyday.dao.MenuDao;
import com.xrit.sunnyday.dao.PermissionDao;
import com.xrit.sunnyday.dao.RoleDao;
import com.xrit.sunnyday.dao.UserDao;
import com.xrit.sunnyday.entity.PageResult;
import com.xrit.sunnyday.entity.QueryPageBean;
import com.xrit.sunnyday.exception.SunnydayException;
import com.xrit.sunnyday.pojo.Permission;
import com.xrit.sunnyday.pojo.Role;
import com.xrit.sunnyday.pojo.User;
import com.xrit.sunnyday.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 角色管理
 */
@Service(interfaceClass = RoleService.class)
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    @Autowired
    PermissionDao permissionDao;

    @Autowired
    MenuDao menuDao;

    @Autowired
    UserDao userDao;

    /**
     * 按条件分页查询
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult pagination(QueryPageBean queryPageBean) {
        //        不是null时模糊查询
        if(!StringUtils.isEmpty(queryPageBean.getQueryString())) {
            queryPageBean.setQueryString("%" + queryPageBean.getQueryString() + "%");
        }
//        开启分页
        PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());
//        按条件查询
        List<Role> roleList = roleDao.QueryCriteria(queryPageBean.getQueryString());
//        获取分页信息
        PageInfo<Role> rolePageInfo = new PageInfo<>(roleList);
//        封装到pageResult并且返回
        PageResult pageResult = new PageResult(rolePageInfo.getTotal(), rolePageInfo.getList());
//        返回
        return pageResult;
    }



    /**
     * 添加角色与权限
     */
    @Override
    public void RoleAdd(Role role, Integer[] permissionIds, Integer[] menus) {
//        添加角色
        roleDao.RoleAdd(role);
//        判断checkGroupIds是否有值
        if (permissionIds != null){
            for (Integer permissionId : permissionIds) {
//                建立角色与权限的关系
                permissionDao.RolePermissionAdd(role.getId(),permissionId);
            }
        }
        if (menus != null){
            for (Integer menuId : menus) {
                menuDao.RoleMenuAdd(role.getId(),menuId);
            }
        }
    }

    /**
     * 查询回显角色信息权限以及菜单
     */
    @Override
    public Map<String, Object> QueryById4Edit(Integer id) {
        HashMap<String, Object> map = new HashMap<>();
//        根据角色ID查询角色基本信息
        Role role = roleDao.QueryRoleByRoleID(id);
//        查询这个角色已有菜单ID
        List<Integer> defaultCheckedKeys = menuDao.QueryMenuId(id);
        for (Integer defaultCheckedKey : defaultCheckedKeys) {
            System.out.println(defaultCheckedKey);
        }
//        查询全部权限
        List<Permission> permissions = permissionDao.QueryPermissionAll();
//        查询这个角色已有权限ID
        List<Integer> permissionIds = permissionDao.QueryPermissionId(id);

        map.put("role",role);
        map.put("permissionss",permissions);
        map.put("defaultCheckedKeys",defaultCheckedKeys);
        map.put("permissionIds",permissionIds);

        return map;
    }

    /**
     * 删除角色
     */
    @Override
    public void RoleDelete(Integer id) throws SunnydayException{
//        根据RoleID判断是否与用户有关系
        Integer integer = userDao.QueryUserRoleByRoleId(id);
        if (integer>0){
//            如果有关系则不能删除
            throw new SunnydayException("该角色已被用户关联则不能删除！");
        }
//        判断是否与权限有关系
        Integer integer1 = permissionDao.QueryRolePermissionByRoleId(id);
        if (integer1>0){
//            有关系解除关系
            permissionDao.RolePermissionDeleteByRoleId(id);
        }
//        并且还要判断是否与菜单有关系
        Integer integer2 = menuDao.QueryRoleMenuByRoleId(id);
        if (integer2>0){
//            与菜单有关系解除关系
            menuDao.RoleMenuDeleteByRoleId(id);
        }
        roleDao.RoleDelete(id);
    }

    /**
     * 根据角色ID修改角色信息
     */
    @Override
    public void RoleUpdate(Role role, Integer[] permissionIds, Integer[] menus) {
//        修改角色基本信息
        roleDao.RoleUpdate(role);
//        修改角色与权限的关系 先根据角色ID删除角色与权限的全部关系
        permissionDao.RolePermissionDeleteByRoleId(role.getId());
        for (Integer permissionId : permissionIds) {
//            然后角色根据权限ID重新建立关系
            permissionDao.RolePermissionAdd(role.getId(),permissionId);
        }
//        修改角色与菜单的关系 先根据角色ID删除角色与菜单的全部关系
        menuDao.RoleMenuDeleteByRoleId(role.getId());
        for (Integer menuId : menus) {
            System.out.println(menuId);
//            然后角色根据菜单ID重新建立关系
            menuDao.RoleMenuAdd(role.getId(),menuId);
        }
    }
}
